package com.bicon.botu.mall.goods.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.bicon.botu.mall.goods.service.*;
import com.bicon.botu.core.base.common.BusinessException;
import com.bicon.botu.mall.goods.commons.GoodsConstants;
import com.bicon.botu.mall.goods.entity.Product;
import com.bicon.botu.mall.goods.entity.ProductRepertory;
import com.bicon.botu.mall.goods.entity.TracePlan;
import com.bicon.botu.mall.goods.mapper.ProductMapper;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * <p> 商品信息维护
 * </p>
 *
 * @author tao.zeng.
 * @since 2018/3/16.
 */
@Service
public class ProductServiceV2Impl extends ServiceImpl<ProductMapper, Product> implements IProductServiceV2 {

    /**
     * 商品服务
     */
    @Autowired
    private IProductService productService;

    /**
     * 商品图片服务
     */
    @Autowired
    private IProductPictureService pictureService;

    /**
     * 定制方案服务
     */
    @Autowired
    private TracePlanService tracePlanService;

    /**
     * 微量元素服务
     */
    @Autowired
    private ITraceElementService elementService;

    // 1. 添加商品 通用信息
    // 2. 添加商品 详细描述
    // 3. 添加商品 商品属性
    // 4. 添加商品 商品相册
    // 5. 添加商品 其他信息
    // 6. 添加商品 关联地区
    // 7. 添加商品 启用定制

    /**
     * @param saveOrUpdate     操作类型 1 保存 2 修改
     * @param productId        商品id
     * @param productCode      商品编号
     * @param productType      商品类型  1 定制商品 2 非定制商品
     * @param classify         分类Id
     * @param brandId          品牌Id
     * @param supplier         供货商
     * @param buyingPrice      进货价
     * @param productName      商品名
     * @param description      描述
     * @param details          详细描述 <p>描述</p>
     * @param productAttr      商品属性 sku 信息 json
     *                         [{"productNum":"0","price":"0","picture":"http://192.168.10.34:1111/BOTU/mall/productImage/n/20180316/9160f9a6bcb34d45b2447510bfd9f697.png","productArrId1":"4b5b525aa3514ac496bcf429d0776e13","productArrId2":"885412ea32dd4f0db3da64dbee8a3dff","skuName":"颜色:红,尺码:l"}]
     * @param pictureStr       图片地址json
     *                         [{"productUrl":"http://192.168.10.34:1111/BOTU/mall/productImage/n/20180316/20525aac4f4148e08dfc2d607a947aef.png"}]
     * @param weight           重量
     * @param volume           体积
     * @param invoiceType      发票类型（0无需发票，1普通发票，2电子发票）
     * @param noticeNum        警告数量
     * @param upShelves        是否上架
     * @param isProduct        是否作为商品
     * @param isFreeFreight    是否免运费(1免运费，其它uuid为运费模板id)
     * @param logisticsType    物流商
     * @param region           销售区域
     * @param isOnBefore       是否启用前身文字
     * @param isOnAfter        是否启用后身文字定义
     * @param beforeText       前身文字数量
     * @param afterText        后身文字数量
     * @param isEnableTrace    是否启用微量元素自定义
     * @param trancePlanIdJson 定制方案id Json
     * @return
     */
    @Override
    @Transactional(rollbackFor = BusinessException.class)
    public boolean addProduct(
            // 基础信息
            String userId, String saveOrUpdate, String productId, String productCode,
            // 通用信息
            String productType, String classify, String brandId, String supplier, BigDecimal buyingPrice, String productName, String label,
            // 详细描述
            String details,
            // 商品属性
            String productAttr,
            // 商品相册
            String pictureStr,
            // 其他信息
            Double weight, Double volume, Integer invoiceType, Integer noticeNum, String upShelves, String isProduct, String isFreeFreight, String logisticsType,
            // 关联地区
            String region,
            // 启用定制
            String posterPicture, String isOnBefore, String isOnAfter, Integer beforeText, Integer afterText, String isEnableTrace, String trancePlanIdJson,
            String planCode, String suitCrowd, String element) {

        Product product = new Product();
        switch (saveOrUpdate) {
            case GoodsConstants.SAVE:
                product.preInsert();
                break;
            case GoodsConstants.UPDATE:
                product.preUpdate();
                product.setId(productId);
                break;
            default:
                return false;
        }
        product.setCategoryId(classify);
        product.setLable(label);
        product.setIsFreeFreight(isFreeFreight);
        product.setIsProduct(isProduct);
        product.setLogisticsType(logisticsType);
        product.setNoticeNum(noticeNum);
        product.setProductName(productName);
        product.setProductType(productType);
        product.setUpShelves(upShelves);
        product.setServer(supplier);
        product.setWeight(weight);
        product.setVolume(volume);
        product.setInvoiceType(invoiceType);
        product.setServer(supplier);
        product.setDetails(details);
        product.setBrandId(brandId);
        product.setProductRegion(region);
        product.setIsOnBefore(isOnBefore);
        product.setIsOnAfter(isOnAfter);
        product.setBeforeText(beforeText);
        product.setAfterText(afterText);
        product.setTraceElement(isEnableTrace);
        product.setProductCode(productCode);
        product.setShowState("0");
        product.setBuyingPrice(buyingPrice == null ? new BigDecimal("0") : buyingPrice);
        List<String> trancePlanId = (List<String>) JSONArray.parse(trancePlanIdJson);
        if (CollectionUtils.isNotEmpty(trancePlanId)) {
            String s = trancePlanId.toString();
            s = new StringBuilder(s).deleteCharAt(s.length() - 1).deleteCharAt(0).toString();
            product.setTracePlanId(s);
        }
        boolean flag = product.insertOrUpdate();

        if (flag) {
            // 1. 添加图片
            flag = pictureService.addPicture(pictureStr, product.getId());
        }
        if (flag) {
            // 2. 添加 sku 信息
            flag = productService.addRepertoryInfo(productAttr, saveOrUpdate, product.getId(), productName);
        }

        // 4. 最低价处理
        List<ProductRepertory> list = JSONObject.parseArray(productAttr, ProductRepertory.class);
        BigDecimal bigDecimal = productService.getProductMinPrice(list);
        product.setProductPrice(bigDecimal);

        // 5. 定制商品处理 定制类型并且启用定制
        if (product.getProductType().equals(GoodsConstants.CUSTOM_STATE1) && isEnableTrace.equals(GoodsConstants.CUSTOM_STATE1)) {
            // 1. 添加定制方案表
            TracePlan tracePlan = tracePlanService.addTracePlan(userId, planCode, suitCrowd, posterPicture);
            if (tracePlan != null) {
                int tracePlanId = tracePlan.getId();
                // 2. 添加微量元素
                elementService.addTraceElement(element, product.getId(), tracePlanId);
            }
        }

        // 6. 缓存
        productService.cacheProductInfo(product, pictureStr);

        return flag;
    }
}
